/*
  对axios进行封装，完成以下功能：
    1. 增加请求地址公共前缀 /api
    2. 增加请求的公共参数 token userTempId
      （目前还用不上）
    3. 发送请求try里面就是功能成功，catch功能失败或请求失败
    4. 统一进行错误提示
    5. 错误提示更加准备（详细的错误提示）
    6. 请求进度
*/

import axios from "axios";
import NProgress from "nprogress";
import "nprogress/nprogress.css";

NProgress.configure({ showSpinner: false });

const errorMessages = {
  401: "没有权限访问",
  403: "禁止访问",
  404: "资源找不到",
  500: "服务器故障",
};

// request功能和axios基本一致
const requestMock = axios.create({
  // 1. 增加请求地址公共前缀
  baseURL: "/mock",
  // 公共请求头
  headers: {},
  // 请求超时时间：请求超过10s就会中断
  timeout: 10000,
});

/*
  设置请求拦截器（中间件函数）
  
  当你使用request去发送请求时，流程：
    1. 先触发请求拦截器设置的回调函数
    2. 发送请求
    3. 触发响应拦截器设置的回调函数
    4. async await / then/catch / try catch

    Promise.resolve()
      .then(
        请求拦截器成功回调, 请求拦截器失败回调
      )
      .then(
        发送请求的代码, undefined
      )
      .then(
        响应拦截器成功回调, 响应拦截器失败回调
      )
    
    外面使用时 request().then().catch()
        then方法功能成功
        catch方法功能失败或请求失败
*/

// 请求拦截器
requestMock.interceptors.request.use(
  (config) => {
    // 成功的回调
    // config就是请求的配置对象 { method, url, body, params, ... }
    // 2. 增加请求的公共参数 token userTempId
    // config.headers.token = "xxxx";
    NProgress.start();

    // 返回值config会作为发送请求的配置对象，去发送请求
    return config;
  }
  // () => {
  //   // 失败的回调，一般触发不了
  // }
);

// 响应拦截器
requestMock.interceptors.response.use(
  (response) => {
    NProgress.done();

    // 成功的回调 2xx 请求成功
    // 3. 发送请求try里面就是功能成功，catch功能失败或请求失败
    // 判断功能是否成功
    if (response.data.code === 200) {
      // 功能成功，返回数据
      return response.data.data;
    }

    // 4. 统一进行错误提示
    const message = response.data.message || "未知错误，请求管理员";
    // 功能失败，外面要触发catch
    alert(message);
    return Promise.reject(message);
  },
  (error) => {
    NProgress.done();
    // 失败的回调 非2xx 请求失败
    // 400 500 断网 网速太慢
    // 5. 错误提示更加准备（详细的错误提示）

    console.dir(error);
    let message = "未知错误，请求管理员";

    if (error.response) {
      // repsonse有值，说明响应回来了，有响应状态码
      // if (error.response.status === 404) {
      //   message = "资源找不到";
      // } else if (error.response.status === 401) {
      //   message = "没有权限访问";
      // } else if (error.response.status === 403) {
      //   message = "禁止访问";
      // } else if (error.response.status === 500) {
      //   message = "服务器故障";
      // }
      message = errorMessages[error.response.status];
    } else {
      // repsonse没有值，说明响应没有回来，断网 Network Error 网速太慢 timeout
      if (error.message.indexOf("Network Error") > -1) {
        message = "网络断开链接，请打开网络链接试试";
      } else if (error.message.indexOf("timeout") > -1) {
        message = "网速太慢了，打开4G网或连接WIFI试试";
      }
    }

    alert(message);
    return Promise.reject(message);
  }
);

export default requestMock;
